from PyQt5 import QtWidgets
import configparser
from PyQt5.QtCore import *
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5 import uic
import videoscriptcore
import scripteditor
import client
import publishmenu
import settings
class ScriptsMenu(QMainWindow):

    edit_response_false = pyqtSignal()
    edit_response_true = pyqtSignal()
    update_table = pyqtSignal()
    reset_editing_status = pyqtSignal()
    add_url_response = pyqtSignal()

    def __init__(self, username):
        QWidget.__init__(self)
        uic.loadUi("UI/rawscripts.ui", self)
        self.setWindowTitle("Script Select Menu")
        self.loggedinas.setText("Logged in as: %s" % username)
        self.treeWidget.currentItemChanged.connect(self.changeSelected)
        self.startEditing.clicked.connect(self.startVideoEditor)
        self.refreshScripts.clicked.connect(self.refreshScriptsRequest)
        self.flagQuality.clicked.connect(lambda : self.flagScript("QUALITY"))
        self.addscript.clicked.connect(self.addScriptFromURL)
        self.update_table.connect(self.updateColors)
        self.add_url_response.connect(self.addedNewScript)
        self.reset_editing_status.connect(self.resetEditingStatus)
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.updateTime)
        self.timer.start(4000)
        self.currentScriptSelected = None
        self.isEditing = False

    def addedNewScript(self):
        self.addresponse.setText(client.addScriptResponse)

    def addScriptFromURL(self):
        url = self.scripturl.text()
        if url is None:
            self.addresponse.setText("Please Enter a URL")
        else:
            self.addresponse.setText("Waiting for response from server...")
            client.addScriptByURL(url)

    def flagScript(self, flagtype):
        if self.currentScriptSelected is not None:
            if flagtype == "QUALITY":
                title = "Warning, you are about to flag a script for quality"
                message = "You are about to flag this script with a QUALITY tag \n"
                message += "A QUALITY tag means that this script " \
                           "will no longer show up here "
                self.createPopup("Warning", QMessageBox.Information, title, message)
                QMessageBox.Ok | QMessageBox.Cancel
                if self.retMsg == QMessageBox.Ok:
                    client.flagscript(self.currentScriptSelected, "QUALITY")
                elif self.retMsg == QMessageBox.Cancel:
                    pass
        else:
            print("Current selected script number return a None")

    def updateTime(self):
        self.changeSelected()

    def startVideoEditor(self):
        if hasattr(self, "currentTreeWidget"):
            scriptName = self.currentTreeWidget.text(0)
            scriptNo = scriptName.replace("script", "")
            indexSelectedScript = videoscriptcore.getScripts().index(int(scriptNo))
            selectedScript = videoscriptcore.video_scripts[indexSelectedScript]
            client.editScript(selectedScript.scriptno)
            self.videoEditorWindow = scripteditor.VideoEditor(selectedScript, self)
            self.videoEditorWindow.show()
            self.isEditing = True

    def resetEditingStatus(self):
        self.isEditing = False

    def changeSelected(self):
        try:
            if not self.treeWidget.currentItem().text(0) in videoscriptcore.getCategories():
                scriptName = self.treeWidget.currentItem().text(0)
                scriptNo = scriptName.replace("script", "")
                indexSelectedScript = videoscriptcore.getScripts().index(int(scriptNo))
                status = videoscriptcore.video_scripts[indexSelectedScript].status
                if hasattr(self, "currentTreeWidget"):


                    if status == "RAW":
                        if settings.darkMode:
                            self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("white")))
                        else:
                            self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("black")))
                        self.startEditing.setEnabled(True)
                        self.flagQuality.setEnabled(True)
                    elif status == "EDITING":
                        self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("yellow")))
                        self.startEditing.setEnabled(False)
                        self.flagQuality.setEnabled(False)
                    elif status == "COMPLETE":
                        self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("green")))
                        self.startEditing.setEnabled(False)
                        self.flagQuality.setEnabled(False)
                    elif status == "MANUALCOMPLETE":
                        self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("darkgreen")))
                        self.startEditing.setEnabled(False)
                        self.flagQuality.setEnabled(False)
                    elif status == "QUALITY":
                        self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("red")))
                        self.startEditing.setEnabled(False)
                        self.flagQuality.setEnabled(False)
                    if self.isEditing:
                        self.startEditing.setEnabled(False)

                self.updateDetailScreen()
        except AttributeError:
            self.updateDetailScreen()

    def updateDetailScreen(self):
        self.textBrowser.clear()
        self.currentTreeWidget = self.treeWidget.currentItem()
        try:
            scriptName = self.currentTreeWidget.text(0)
            scriptNo = scriptName.replace("script", "")
            indexSelectedScript = videoscriptcore.getScripts().index(int(scriptNo))
            selectedScript = videoscriptcore.video_scripts[indexSelectedScript]
            self.currentScriptSelected = selectedScript.scriptno
            self.textBrowser.append("Category: %s\n"%selectedScript.sub_reddit)
            self.textBrowser.append("Upvotes: %s"%selectedScript.upvotes)
            self.textBrowser.append("Author: %s"%selectedScript.author)
            self.textBrowser.append("Vid Number: %s"%selectedScript.vidNo)
            self.textBrowser.append("Status: %s"%selectedScript.status)
            self.textBrowser.append("Script ID: %s"%selectedScript.scriptno)
            self.textBrowser.append("Being Edited by: %s"%selectedScript.editedby)
            self.textBrowser.append("\nTitle: %s\n"%selectedScript.title)

            self.editedby.setText(selectedScript.editedby)
            self.currentTreeWidget.setForeground(0, QtGui.QBrush(QtGui.QColor("blue")))
        except AttributeError:
            pass
        self.updateColors()


    def updateColors(self):
        try:
            children = self.count_tems()
            for i in range(len(children)):
                scriptName = children[i].text(0)
                scriptNo = scriptName.replace("script", "")
                indexSelectedScript = videoscriptcore.getScripts().index(int(scriptNo))
                status = videoscriptcore.video_scripts[indexSelectedScript].status
                if hasattr(self, "currentTreeWidget"):
                    if status == "RAW":
                        if settings.darkMode:
                            children[i].setForeground(0, QtGui.QBrush(QtGui.QColor("white")))
                        else:
                            children[i].setForeground(0, QtGui.QBrush(QtGui.QColor("black")))
                    elif status == "EDITING":
                        children[i].setForeground(0, QtGui.QBrush(QtGui.QColor("yellow")))
                    elif status == "COMPLETE":
                        children[i].setForeground(0, QtGui.QBrush(QtGui.QColor("green")))
                    elif status == "MANUALCOMPLETE":
                        children[i].setForeground(0, QtGui.QBrush(QtGui.QColor("darkgreen")))
                    elif status == "QUALITY":
                        children[i].setForeground(0, QtGui.QBrush(QtGui.QColor("red")))
        except:
            print("error occured recolouring scripts")
    def count_tems(self):
        count = 0
        iterator = QtWidgets.QTreeWidgetItemIterator(self.treeWidget)  # pass your treewidget as arg
        items = []
        while iterator.value():
            item = iterator.value()

            if item.parent():
                if item.parent().isExpanded():
                    count += 1
                    items.append(item)

            else:
                # root item
                count += 1
            iterator += 1

        return items

    def refreshScriptsRequest(self):
        videoscriptcore.video_scripts.clear()
        self.treeWidget.clear()
        if self.scriptFilter.currentText() == "Highest Upvotes":
            client.downloadScripts(settings.amount_scripts_download, "ups")
        elif self.scriptFilter.currentText() == "Latest Posts":
            client.downloadScripts(settings.amount_scripts_download, "latest posts")
        elif self.scriptFilter.currentText() == "Recently Added":
            client.downloadScripts(settings.amount_scripts_download, "recently added")
        elif self.scriptFilter.currentText() == "Highest Comments":
            client.downloadScripts(settings.amount_scripts_download, "comments")

    def addRawScriptsToTree(self):
        self.treeWidget.clear()
        for i, vid in enumerate(videoscriptcore.video_scripts):
            new_item = self.addChild(vid.sub_reddit, "script%s"%vid.vidNo)
            if vid.status == "EDITING":
                new_item.setForeground(0, QtGui.QBrush(QtGui.QColor("yellow")))
            elif vid.status == "RAW":
                if settings.darkMode:
                    new_item.setForeground(0, QtGui.QBrush(QtGui.QColor("white")))
                else:
                    new_item.setForeground(0, QtGui.QBrush(QtGui.QColor("black")))
            elif vid.status == "COMPLETE":
                new_item.setForeground(0, QtGui.QBrush(QtGui.QColor("green")))
            elif vid.status == "MANUALCOMPLETE":
                new_item.setForeground(0, QtGui.QBrush(QtGui.QColor("darkgreen")))

        self.treeWidget.expandToDepth(0)
    def resetColor(self):
        for i in range(self.treeWidget.topLevelItemCount()):
            #for y in range(self.treeWidget.)
            if settings.darkMode:
                self.treeWidget.topLevelItem(i).setForeground(i, QtGui.QBrush(QtGui.QColor("white")))
            else:
                self.treeWidget.topLevelItem(i).setForeground(i, QtGui.QBrush(QtGui.QColor("black")))

    def getAllTopLevel(self):
        items = []
        for index in range(self.treeWidget.topLevelItemCount()):
            items.append(self.treeWidget.topLevelItem(index))
        return items

    def addTopLevel(self, name):
        if self.getTopLevelByName(name) is None:
            QTreeWidgetItem(self.treeWidget, [name])

    def addChild(self, parent, child):
        self.addTopLevel(parent)
        return QTreeWidgetItem(self.getTopLevelByName(parent), [child])

    def getTopLevelByName(self, name):
        for index in range(self.treeWidget.topLevelItemCount()):
            item = self.treeWidget.topLevelItem(index)
            if item.text(0) == name:
                return item
        return None

    def closeEvent(self, event):
        if hasattr(self, "videoEditorWindow"):
            self.videoEditorWindow.close()
        if not publishmenu.currentPublishMenu is None:
            publishmenu.currentPublishMenu.close()
        self.close()
        client.safeDisconnect()

    def createPopup(self, messagetype, icon, text, message):
        self.msg = QMessageBox()
        self.msg.setIcon(icon)
        self.msg.setText(text)
        self.msg.setInformativeText(message)
        self.msg.setWindowTitle(messagetype)
        if messagetype == "Error":
            self.msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Close)
        if messagetype == "Warning":
            self.msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
        else:
            self.msg.setStandardButtons(QMessageBox.Ok | QMessageBox.Close)
        self.retMsg = self.msg.exec_()